package cn.wolfcode.luowowo.website.interceptor;

import cn.wolfcode.luowowo.cache.service.IUserInfoRedisService;
import cn.wolfcode.luowowo.member.domain.UserInfo;
import cn.wolfcode.luowowo.website.annotation.RequireLogin;
import cn.wolfcode.luowowo.website.util.CookieUtil;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 登录控制拦截器
 *
 * HandlerInterceptor : jdk1.8之前因为实现接口时所有方法必须重写一次, 而我们关注仅仅是某个方法, 每次都必须重写麻烦, 所以引入
 * HandlerInterceptorAdapter 实现接口, 而重写方法都是空实现, 我们自定义类只需要继承该类, 重写需要方法即可, 进而代码简化操作.
 *
 * 适配器模式  XxxAdapter
 * jdk1.8之后, HandlerInterceptor 接口拥有新特性, 接口方法定义时候可以默认实现, 我们的自定义的类继续重写需要关注方法即可.
 *
 */

public class CheckLoginInterceptor /*extends HandlerInterceptorAdapter*/  implements HandlerInterceptor {

    @Reference
    private IUserInfoRedisService userInfoRedisService;

    //检查当前用户是否登录
    @Override
    public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {

        //获取当前请求的方法
        // springmvc启动时将所有映射方法封装成HandlerMethod 对象
        if(handler instanceof HandlerMethod){
            //只有动态请求才可以强转
            HandlerMethod hm = (HandlerMethod) handler;

            //判断该方法上面是否贴RequireLogin
            if(hm.hasMethodAnnotation(RequireLogin.class)){
                //如果有贴, 进行登录判断
                String token = CookieUtil.getToken(request);
                UserInfo userInfo = userInfoRedisService.getUserByToken(token);
                if(userInfo == null){
                    response.sendRedirect("/login.html");
                    return false;

                }
            }
        }


        //如果没贴, 直接放行
        return true;
    }
}
